package com.hxk.juc.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * java线程池案例
 * 为什么要使用线程池
 *      1、提高线程的复用率，不用一直new新线程，重复利用已经创建的线程来降低线程的创建和销毁开销，节省系统资源。
 *      2、提高线程的访问速度，当任务达到时，不用创建新的线程，直接利用线程池的线程。
 *      3、有效的管理线程，可以控制最大并发数，控制线程的创建等。
 * java的线程池体系：
 *      `Executor`→`ExecutorService`→`AbstractExecutorService`→`ThreadPoolExecutor`。`ThreadPoolExecutor`是线程池创建的核心类。
 * juc线程池Executor的工具类Executors提供了常用的几种线程池，但实际常用的有3种：
 *      1、FixedThreadPool，定长线程池，底层使用LinkedBlockingQueue阻塞队列实现
 *      2、SingleThreadExecutor 单个线程池，底层使用LinkedBlockingQueue阻塞队列实现。
 *      3、CachedThreadPool 变长线程池，底层使用SynchronousQueue同步阻塞队列实现
 *     以上3这三个线程池底层都是通过new ThreadPoolExecutor来实现
 * 使用：
 *      线程池的调用：threadPool.execute(),threadPool.submit();
 *      线程池的销毁：threadPool.shutdown();
 */
public class ThreadPoolCase {

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newFixedThreadPool(3);//设定固定长度的线程池
        //ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程池
        //ExecutorService threadPool = Executors.newCachedThreadPool();//变长线程池,根据处理能力，判断如果一个线程能处理，则一个线程处理，不行会根据处理能力创建合理的线程去处理
        try {
            for (int i = 1; i <=10 ; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"\t 办理业务");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();
        }
    }
}
